/**
 * 安全配置
 * Security Configuration
 */

module.exports = {
  // 请求频率限制配置
  rateLimit: {
    // 是否启用频率限制
    enabled: process.env.RATE_LIMIT_ENABLED !== 'false',
    
    // 通用限制
    general: {
      windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS) || 15 * 60 * 1000, // 15分钟
      max: parseInt(process.env.RATE_LIMIT_MAX_REQUESTS) || 100, // 最大请求数
    },
    
    // 认证限制
    auth: {
      windowMs: parseInt(process.env.AUTH_RATE_LIMIT_WINDOW_MS) || 15 * 60 * 1000, // 15分钟
      max: parseInt(process.env.AUTH_RATE_LIMIT_MAX_ATTEMPTS) || 5, // 最大登录尝试次数
    },
    
    // 上传限制
    upload: {
      windowMs: parseInt(process.env.UPLOAD_RATE_LIMIT_WINDOW_MS) || 60 * 1000, // 1分钟
      max: parseInt(process.env.UPLOAD_RATE_LIMIT_MAX_UPLOADS) || 10, // 最大上传次数
    },
    
    // 管理员操作限制
    admin: {
      windowMs: parseInt(process.env.ADMIN_RATE_LIMIT_WINDOW_MS) || 5 * 60 * 1000, // 5分钟
      max: parseInt(process.env.ADMIN_RATE_LIMIT_MAX_REQUESTS) || 20, // 最大管理员请求数
    }
  },

  // 文件上传安全配置
  fileUpload: {
    // 最大文件大小 (100MB)
    maxFileSize: parseInt(process.env.MAX_FILE_SIZE) || 100 * 1024 * 1024,
    
    // 最大文件数量
    maxFiles: parseInt(process.env.MAX_FILES_PER_REQUEST) || 10,
    
    // 允许的MIME类型
    allowedMimeTypes: [
      // 图片
      'image/jpeg', 'image/png', 'image/webp', 'image/gif',
      // 视频
      'video/mp4', 'video/webm', 'video/avi', 'video/mov',
      // 音频
      'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/m4a',
      // 文档
      'application/pdf', 'text/plain', 'text/csv',
      'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      // 压缩文件
      'application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed'
    ],
    
    // 禁止的文件扩展名
    blockedExtensions: [
      '.exe', '.bat', '.cmd', '.com', '.pif', '.scr', '.vbs', '.js', '.jar',
      '.php', '.asp', '.aspx', '.jsp', '.sh', '.py', '.rb', '.pl', '.dll',
      '.msi', '.app', '.deb', '.rpm', '.dmg'
    ]
  },

  // XSS防护配置
  xss: {
    // 是否启用XSS防护
    enabled: process.env.XSS_PROTECTION_ENABLED !== 'false',
    
    // 允许的HTML标签（用于富文本编辑器）
    allowedTags: {
      p: [],
      br: [],
      strong: [],
      em: [],
      u: [],
      s: [],
      h1: [], h2: [], h3: [], h4: [], h5: [], h6: [],
      ul: [], ol: [], li: [],
      blockquote: [],
      a: ['href', 'title', 'target'],
      img: ['src', 'alt', 'width', 'height', 'style'],
      div: ['class', 'style'],
      span: ['class', 'style'],
      table: ['class'],
      thead: [], tbody: [], tr: [], th: [], td: [],
      code: ['class'],
      pre: ['class']
    }
  },

  // CSRF保护配置
  csrf: {
    // 是否启用CSRF保护
    enabled: process.env.CSRF_PROTECTION_ENABLED !== 'false',
    
    // CSRF token过期时间（毫秒）
    tokenExpiry: parseInt(process.env.CSRF_TOKEN_EXPIRY) || 24 * 60 * 60 * 1000, // 24小时
  },

  // SQL注入防护配置
  sqlInjection: {
    // 是否启用SQL注入防护
    enabled: process.env.SQL_INJECTION_PROTECTION_ENABLED !== 'false',
    
    // 可疑模式
    suspiciousPatterns: [
      /(\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|EXEC|UNION|SCRIPT)\b)/gi,
      /(\b(OR|AND)\s+\d+\s*=\s*\d+)/gi,
      /(--|\/\*|\*\/|;)/g,
      /(\b(CHAR|NCHAR|VARCHAR|NVARCHAR)\s*\(\s*\d+\s*\))/gi,
      /(\b(WAITFOR|DELAY)\b)/gi,
      /(\b(CAST|CONVERT)\b)/gi
    ]
  },

  // 输入验证配置
  validation: {
    // 邮箱验证
    email: {
      maxLength: 100,
      pattern: /^[^\s@]+@[^\s@]+\.[^\s@]+$/
    },
    
    // 密码验证
    password: {
      minLength: 6,
      maxLength: 128,
      requireUppercase: false,
      requireLowercase: false,
      requireNumbers: false,
      requireSpecialChars: false
    },
    
    // 用户名验证
    nickname: {
      minLength: 1,
      maxLength: 50,
      pattern: /^[a-zA-Z0-9\u4e00-\u9fa5_-]+$/
    },
    
    // 文件名验证
    filename: {
      maxLength: 255,
      pattern: /^[a-zA-Z0-9\u4e00-\u9fa5._-]+$/
    }
  },

  // 安全头配置
  headers: {
    // 是否启用安全头
    enabled: process.env.SECURITY_HEADERS_ENABLED !== 'false',
    
    // Content Security Policy
    csp: {
      defaultSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'", "https://cdn.tailwindcss.com", "https://cdn.jsdelivr.net"],
      scriptSrc: ["'self'", "'unsafe-inline'", "https://cdn.tailwindcss.com"],
      imgSrc: ["'self'", "data:", "blob:"],
      fontSrc: ["'self'", "https://cdn.jsdelivr.net"],
      connectSrc: ["'self'"],
      mediaSrc: ["'self'", "blob:"],
      objectSrc: ["'none'"],
      frameSrc: ["'none'"]
    },
    
    // HSTS配置
    hsts: {
      maxAge: 31536000, // 1年
      includeSubDomains: true,
      preload: true
    }
  },

  // IP访问控制
  ipControl: {
    // 是否启用IP白名单
    whitelistEnabled: process.env.IP_WHITELIST_ENABLED === 'true',
    
    // IP白名单
    whitelist: process.env.IP_WHITELIST ? process.env.IP_WHITELIST.split(',') : [],
    
    // 是否启用IP黑名单
    blacklistEnabled: process.env.IP_BLACKLIST_ENABLED === 'true',
    
    // IP黑名单
    blacklist: process.env.IP_BLACKLIST ? process.env.IP_BLACKLIST.split(',') : []
  },

  // 会话安全配置
  session: {
    // 会话超时时间（毫秒）
    timeout: parseInt(process.env.SESSION_TIMEOUT) || 24 * 60 * 60 * 1000, // 24小时
    
    // 是否启用安全cookie
    secureCookie: process.env.NODE_ENV === 'production',
    
    // cookie的SameSite属性
    sameSite: process.env.COOKIE_SAME_SITE || 'strict'
  },

  // 日志配置
  logging: {
    // 是否记录安全事件
    enabled: process.env.SECURITY_LOGGING_ENABLED !== 'false',
    
    // 是否记录所有请求
    logAllRequests: process.env.LOG_ALL_REQUESTS === 'true',
    
    // 是否记录失败的请求
    logFailedRequests: process.env.LOG_FAILED_REQUESTS !== 'false'
  }
};